import { MarketDataService, KlineBar } from '../market-data.service';
import * as fs from 'fs';
import * as path from 'path';

/**
 * 市场数据服务使用示例
 */
async function marketDataExample() {
  console.log('开始运行市场数据服务示例...');

  // 创建市场数据服务实例，可以配置代理和超时时间
  const marketDataService = new MarketDataService(
    // 尝试使用备用API地址
    'https://www.okx.com', // 或者尝试 'https://www.okx.com', 'https://www.okx.me', 'https://www.okg.com'
    {
      // SOCKS5代理配置，使用完整的URL格式
      proxy: 'socks5://192.168.10.138:7890',
      timeout: 30000 // 30秒超时
    }
  );

  try {
    // 首先测试连接
    console.log('测试与OKX API的连接...');
    const connectionTest = await marketDataService.testConnection();

    if (!connectionTest.success) {
      console.error(`连接测试失败: ${connectionTest.message}`);
      return;
    }

    console.log('连接测试成功!');

    // 获取ETH的不同时间周期K线数据
    await getAndSaveEthKlines(marketDataService);

    // // 示例1: 获取BTC-USDT的1小时K线数据，最近10条
    // console.log('\n示例1: 获取BTC-USDT的1小时K线数据');
    // const klines = await marketDataService.getHistoricalKlines({
    //   instId: 'BTC-USDT',
    //   bar: KlineBar.HOUR_1,
    //   limit: 10 
    // });

    // console.log(`获取到 ${klines.length} 条K线数据`);
    // console.log('第一条K线数据:', klines[0]);

    // // 示例2: 获取格式化后的K线数据
    // console.log('\n示例2: 获取格式化后的K线数据');
    // const formattedKlines = await marketDataService.getFormattedHistoricalKlines({
    //   instId: 'BTC-USDT',
    //   bar: KlineBar.HOUR_1,
    //   limit: 5
    // });

    // console.log(`获取到 ${formattedKlines.length} 条格式化K线数据`);
    // console.log('第一条格式化K线数据:', formattedKlines[0]);

    // // 示例3: 获取大量历史数据
    // console.log('\n示例3: 获取大量历史数据');
    // console.log('开始获取BTC-USDT的日K线数据，最多50条...');
    // const allKlines = await marketDataService.getAllHistoricalKlines({
    //   instId: 'BTC-USDT',
    //   bar: KlineBar.DAY_1,
    //   limit: 300  // 每页300条
    // }, 50);  // 最多获取50条

    // console.log(`成功获取到 ${allKlines.length} 条历史K线数据`);
    // if (allKlines.length > 0) {
    //   console.log('最早的一条K线:', allKlines[allKlines.length - 1]);
    //   console.log('最新的一条K线:', allKlines[0]);
    // }

  } catch (error) {
    console.error('获取K线数据失败:', error);
    console.error(`
如果您遇到连接问题，可能的解决方案:
1. 检查网络连接
2. 配置代理服务器 (取消代码中的proxy注释并配置)
3. 增加超时时间
4. 尝试不同的OKX API域名:
   - https://www.okx.com
   - https://www.okx.cab
   - https://www.okx.me
   - https://www.okg.com
5. 确认OKX API在您的地区是否可用
    `);
  }

  console.log('\n市场数据服务示例运行完成');
}

/**
 * 获取ETH的三种不同时间周期的K线数据并保存到文本文件
 * @param marketDataService MarketDataService实例
 */
async function getAndSaveEthKlines(marketDataService: MarketDataService) {
  console.log('\n开始获取ETH-USDT的多周期K线数据...');

  // 定义需要获取的时间周期
  const timeFrames = [
    { period: KlineBar.MINUTE_1, filename: '1min.txt', description: '1分钟' },
    { period: KlineBar.MINUTE_15, filename: '15min.txt', description: '15分钟' },
    { period: KlineBar.HOUR_1, filename: '1hour.txt', description: '1小时' },
    { period: KlineBar.HOUR_4, filename: '4hour.txt', description: '4小时' }
  ];

  // 检查系统时间 (同时显示UTC时间和北京时间)
  const now = new Date();
  console.log(`系统当前UTC时间: ${now.toISOString()}`);
  console.log(`系统当前北京时间: ${formatDateToChinaTime(now)}`);

  // 为每个时间周期获取数据并保存
  for (const tf of timeFrames) {
    console.log(`获取ETH-USDT的${tf.description}K线数据...`);

    try {
      // 获取100条格式化的K线数据
      const klines = await marketDataService.getFormattedHistoricalKlines({
        instId: 'ETH-USDT-SWAP',
        bar: tf.period,
        limit: 300
      });

      console.log(`成功获取到${klines.length}条${tf.description}K线数据`);
      if (klines.length > 0) {
        // 显示UTC时间和北京时间
        const firstTimestampUTC = new Date(klines[0].timestamp).toISOString();
        const lastTimestampUTC = new Date(klines[klines.length - 1].timestamp).toISOString();
        const firstTimestampChina = formatDateToChinaTime(new Date(klines[0].timestamp));
        const lastTimestampChina = formatDateToChinaTime(new Date(klines[klines.length - 1].timestamp));

        console.log(`数据UTC时间范围: 从 ${lastTimestampUTC} 到 ${firstTimestampUTC}`);
        console.log(`数据北京时间范围: 从 ${lastTimestampChina} 到 ${firstTimestampChina}`);
      }

      // 创建输出目录（如果不存在）
      const outputDir = path.join(process.cwd(), 'data');
      if (!fs.existsSync(outputDir)) {
        fs.mkdirSync(outputDir, { recursive: true });
      }

      // 保存数据到文件，使用北京时间
      const filePath = path.join(outputDir, tf.filename);
      const data = klines.map(kline => {
        // 将UTC时间转换为北京时间
        const chinaTimeString = formatDateToChinaTime(new Date(kline.timestamp));
        return `${chinaTimeString},${kline.open},${kline.high},${kline.low},${kline.close},${kline.volume}`;
      }).join('\n');

      // 添加CSV表头
      const header = 'timestamp,open,high,low,close,volume\n';
      fs.writeFileSync(filePath, header + data);

      console.log(`ETH-USDT ${tf.description}K线数据已保存到: ${filePath}`);
    } catch (error) {
      console.error(`获取ETH-USDT ${tf.description}K线数据失败:`, error);
    }
  }

  console.log('ETH-USDT多周期K线数据获取完成');
}

/**
 * 将Date对象格式化为中国时间字符串
 * @param date Date对象
 * @returns 格式化后的中国时间字符串
 */
function formatDateToChinaTime(date: Date): string {
  // UTC+8时区偏移（毫秒）
  const chinaTimezoneOffset = 8 * 60 * 60 * 1000;

  // 获取UTC时间的毫秒数并添加时区偏移
  const chinaTime = new Date(date.getTime() + chinaTimezoneOffset);

  // 使用ISO格式但注明这是北京时间
  return chinaTime.toISOString().replace('Z', '+08:00');
}

// 如果直接运行此文件，则执行示例
if (require.main === module) {
  marketDataExample().catch(console.error);
}

export { marketDataExample };

// 导出获取ETH K线数据的函数
export { getAndSaveEthKlines }; 